iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0

上一章節講述了 PostgreSQL 的鍵置和 mybatis 連線到 DB 的配置,那今天就來實際用 mybatis 的方式來撰寫 SQL。

今天補充一下,雖然講了如何配置連線到 DB 的配置,但沒描述到其相關的環境變數設置(db_classname、db_username 等),這些環境變數配置一般來說都會在 resources 下的 application.properties 進行配置,如下

db_classname=org.postgresql.Driver
db_username=itachi
db_url=jdbc:postgresql://172.17.10.105:5432/employee
db_password=12345678
db_maximum_pool_size=3

在 mapper 目錄下定義一個 UserMapper.java 檔案,其內容會是對 DB 的相關操作定義,像是 add 方法就是用來新增一個使用者。

在 mybatis 提供@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider 註解來實現 CRUD。其中註解裡的 type 表示表示實現 SQL 操作的類,method 表示 type(實現 SQL 操作的類)中的對應方法。通常 Insert、Delete 和 Update 都是返回筆數所以是回傳一個 Integer 類型。

@Mapper
public interface UserMapper {
    @SelectProvider(type = UserProvider.class, method = "addUser")
    public UserResponseVO add(UserRequestVO user);
    
    @DeleteProvider(type = UserProvider.class, method = "delete")
    public Integer delete(@Param("id") String id);
    
    @SelectProvider(type = UserProvider.class, method = "update")
    public UserResponseVO update(UserRequestVO user);
    
    // List<UserResponseVO> get(@Param("id") String id);
    @SelectProvider(type = UserProvider.class, method = "getById")
    public UserResponseVO getById(@Param("id") String id);

    @SelectProvider(type = UserProvider.class, method = "isExistUser")
    public Boolean isExistUser(@Param("name") String name);

}

上述定義了 CRUD 對應的 SQL 操作,接下來我們來實現其 SQL 的語法,在 provider 目錄下我們定義了 UserProvider.java 檔案,這檔案會是定義 SQL 語法的實現,RETURNING 是 PostgreSQL 的特殊用法,可以說我想要回傳那些字段,這個用法可以使用在 Insert、Update 或 Delete 上。

public class UserProvider {
    private final String TABLE = "public.user"; // 對應 SQL 中的表
    // 實現 Insert
    public final String addUser(UserRequestVO user) {
        return new SQL().INSERT_INTO(TABLE)
                .VALUES("name", "#{name}")
                .VALUES("age", "#{age}")
                .VALUES("email", "#{email}")
                .VALUES("tel", "#{tel}")
                .toString() + " RETURNING * ";
    }

    // 實現查詢
    public final String getById(@Param("id") String id) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * " +
                "FROM public.user " +
                "WHERE id = #{id}");

        return sql.toString();
    }
    
    public final String isExistUser(@Param("name") String name) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT ")
        .append("EXISTS ( SELECT 1 FROM ")
        .append(TABLE)
        .append(" WHERE name = #{name} )");

        return sql.toString();
    }
    // 實現 Delete
    public final String delete(@Param("id") String id) {
        return new SQL().DELETE_FROM(TABLE).WHERE("id = #{id}").toString();
    }
    // 實現 Update
    public final String update(UserRequestVO user) {
        SQL sql = new SQL()
            .UPDATE(TABLE)
            .SET("name = #{name}")
            .SET("age = #{age}")
            .SET("email = #{email}")
            .SET("tel = #{tel}")
            .WHERE("id = #{id}");
            return sql.toString() + " RETURNING * ";
    }

}

上述的範例都在 github 上。


上一篇
PostgreSQL 資料儲存與 mybatis
下一篇
談談 Log 的定義以及使用 - part1
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言